﻿// TinyXML_Demo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

#include "tinyxml2.h"
#include "LoadDDSXml.h"
//tinyxml2的类在tinyxml2命名空间
using namespace tinyxml2;

//测试加载xml函数
void testLoadXML()
{
    const char* xmlpath = "TestXml.xml";
	//构造一个xml文档类
	XMLDocument doc;

	//从磁盘加载XML文件。成功返回XML_SUCCESS（0），或者返回errorID。
	XMLError error = doc.LoadFile(xmlpath);
	//也可以解析字符串
	//XMLError tinyxml2::XMLDocument::Parse(const char *xml,size_t nBytes = static_cast<size_t>(-1));
	if (error != XMLError::XML_SUCCESS)
		return;

	//存储到文件，参数2 compact紧凑默认false
	doc.SaveFile(xmlpath, false);
}

//测试插入节点
void testInsertNode()
{
	const char *xmlpath = "TestXml.xml";

	XMLDocument doc;
	XMLError error = doc.LoadFile(xmlpath);
	if (error != XMLError::XML_SUCCESS)
		return;

	//元素
	XMLElement* ElementNode = doc.NewElement("ElementNode");
	//注释
	XMLComment* CommentNode = doc.NewComment("CommentNode");
	//文本
	XMLText* TextNode = doc.NewText("TextNode");
	//XML文件头描述
	XMLDeclaration* DeclarationNode = doc.NewDeclaration("DeclarationNode");
	//未知类型
	XMLUnknown* UnknownNode = doc.NewUnknown("UnknownNode");

	//插入到末尾
	doc.InsertEndChild(ElementNode);
	doc.InsertEndChild(CommentNode);
	doc.InsertEndChild(TextNode);
	doc.InsertEndChild(DeclarationNode);
	doc.InsertEndChild(UnknownNode);
	//插入到开头
	doc.InsertFirstChild(CommentNode);
	//插入到节点的下一个位置
	doc.InsertAfterChild(ElementNode, TextNode);

	doc.SaveFile(xmlpath);
}

//测试遍历节点
void testTraverseNode()
{
	const char *xmlpath = "TestXml.xml";
	XMLDocument doc;
	XMLError error = doc.LoadFile(xmlpath);
	if (error != XMLError::XML_SUCCESS)
		return;

	//获取根节点
	XMLNode* root = doc.RootElement();
	//是否不包含子节点
	bool IsNoChildren = root->NoChildren();

	//获取节点的第一个子节点
	XMLNode* FirstChildNode = root->FirstChild();
	//获取节点的第一个子元素 
	XMLElement* FirstChildElementNode = root->FirstChildElement();

	//获取节点的最后一个子节点
	XMLNode* LastChildNode = root->LastChild();
	//获取节点的最后一个子元素 
	XMLElement* LastChildElementNode = root->LastChildElement();

	//获取节点的下一个兄弟节点
	XMLNode* NextSiblingNode = root->NextSibling();
	//下一个兄弟元素
	XMLElement* NextSiblingElementNode = root->NextSiblingElement();

	//获取节点的上一个兄弟节点
	XMLNode* PreviousSiblingNode = root->PreviousSibling();
	//上一个兄弟元素
	XMLElement* PreviousSiblingElementNode = root->PreviousSiblingElement();

	//遍历所有子节点
	for (XMLNode* child = root->FirstChild(); child != nullptr; child = child->NextSibling())
	{
		//判断节点类型
		if (child->ToElement())
		{
			//元素节点
		}
		else if (child->ToComment())
		{
			//注释节点
		}
		else if (child->ToText())
		{
			//文本节点
		}
		else if (child->ToDeclaration())
		{
			//XML文件头描述节点
		}
		else if (child->ToUnknown())
		{
			//未知类型节点
		}
	}
	//遍历所有子节点
	for (XMLElement* child = root->FirstChildElement(); child != nullptr; child = child->NextSiblingElement())
	{
		//获取节点名称
		const char* name = child->Name();
		//获取节点值
		const char* value = child->Value();
		//获取节点属性
		const char* attr = child->Attribute("attr");
		//获取节点属性值
		const char* attrValue = child->Attribute("attr", "attrValue");
		//获取节点文本
		const char* text = child->GetText();
	}
	doc.SaveFile(xmlpath);
}

//测试删除节点
void testDeleteNode()
{
	const char *xmlpath = "TestXml.xml";
	XMLDocument doc;
	XMLError error = doc.LoadFile(xmlpath);
	if (error != XMLError::XML_SUCCESS)
		return;

	//删除所有子节点
	doc.DeleteChildren();
	//删除指定子节点
	XMLNode* child = doc.LastChild();
	doc.DeleteChild(child);

	doc.SaveFile(xmlpath);
}

//加载TestXml.xml

int main()
{
    std::cout << "Hello World!\n";

	//testLoadXML();
	//testInsertNode();
	//testTraverseNode();
	//testDeleteNode();

	//加载USER_QOS_PROFILES.xml
	std::map<std::pair<std::string, std::string>, std::string> QoSMap;
	LoadQOSXml("USER_QOS_PROFILES.xml", QoSMap);

	//加载TestXml.xml
	std::map<int, StParticipant> ParticipantMap;
	LoadDDSXml("TestXml.xml", ParticipantMap, QoSMap);

	return 0;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
